MODULE SimpleCPX;
(*
 * einfachstes CPX-Demo
 *
 * angelehnt an das Beispiel S. 721 ff. aus
 * Jankowski/Rabich/Reschke: ATARI Profibuch ST-STE-TT, Sybex
 *
 * Aus diesem Beispiel sollte ersichtlich sein, daž die C-Routine cpx_init()
 * in Modula-2 durch den gesamten Initialisierungsteil des Programms gebildet
 * wird. Die R�ckgabe erfolgt durch die Routine CPX.Return().
 *
 * Ein komplexeres Beispiel findet sich mit SampleCPX in SAMPLE.M
 *)

(*
 * (c) 10/1992 A. Alich, C. Sprenger
 *)
IMPORT AES, CPX, evnt, objc;
FROM SYSTEM IMPORT ADR, LONG;

CONST
	nObs = 2;

TYPE
	tObj = RECORD
		next, head, tail: SHORTINT;
		type: SHORTCARD;
		flags, state: BITSET;
		spec: LONG;
		rect: AES.tRect;
	END;
	tTree = ARRAY [0..nObs] OF tObj;
	tpTree = POINTER TO tTree;

CONST
	cRsc = tTree{
		{
			-1, 1, 2,
			objc.Box, {}, {},
			LONG(1101H),
			{0, 0, 32, 11}
		},
		{
			2, -1, -1,
			objc.String, {}, {},
			LONG(0),
			{6, 3, 8, 1}
		},
		{
			0, -1, -1,
			objc.Button, {objc.LastObj, objc.Exit, objc.Default, objc.Selectable},
			{},
			LONG(0),
			{12, 9, 6, 1}
		}
	};

VAR
	pTree: tpTree;

(*$E+*)(*$K+*)
PROCEDURE cpx_call (VAR work: AES.tRect): SHORTINT;

	VAR
		msg: evnt.tMsg;

	BEGIN
		WITH pTree^[0].rect DO
			x := work.x;
			y := work.y;
		END;
		objc.draw (pTree, 0, 8, work);
		VOID (CPX.pXCPB^.Xform_do (pTree, 0, msg));
		(*
		 * Da bei jedem Aufruf des CPX dieses initialisiert wird, und dieses
		 * via CPX.Return() beendet wird, muž die Terminierungskette vorher
		 * "per Hand" aktiviert werden:
		 *)
		CPX.Terminate;
		RETURN 0
		(*
		 * Hier ist die CPX-Ausf�hrung beendet.
		 *)
	END cpx_call;
(*$E=*)(*$K=*)

VAR
	title: ARRAY [0..21] OF CHAR;
	ok: ARRAY [0..3] OF CHAR;
	i: SHORTINT;

(*
 * Der Module-Body dient als cpx_init()-Funktion.
 *)
BEGIN
	WITH CPX.pXCPB^ DO
		IF booting # 0 THEN
			CPX.Return (CPX.tpCpxInfo(1))
		END;
		pTree := ADR (cRsc);
		IF SkipRshFix = 0 THEN
			FOR i := 0 TO nObs DO
				rsh_obfix (pTree, i)
			END;
		END;
		title := 'H„nisch-Modula-2 CPX'; pTree^[1].spec := LONG(ADR (title));
		ok := 'OK'; pTree^[2].spec := LONG(ADR (ok));
		CPX.CpxInfo.cpx_call := cpx_call;
		(*
		 * CPX.Return() bekommt den R�ckgabewert von cpx_init() auf den Weg.
		 *)
		CPX.Return (ADR (CPX.CpxInfo))
		(*
		 * Hierher kommt das Programm NIE!
		 *)
	END;
END SimpleCPX.
			
	
	